fontchooser: Move the filter func to the visibility func
authorBenjamin Otte <otte@redhat.com>
Mon, 19 Sep 2011 13:45:24 +0000 (15:45 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 19 Sep 2011 20:11:06 +0000 (22:11 +0200)
... instead of rereading all the fonts every time.

With this change, the liststore now contains every font face known to
GTK, so we can actually walk it for matching fonts.

gtk/gtkfontchooserwidget.c

index 9ea47b1376751eaab38de2cf812d56141886aecb..1bd14055c1894fbc465a95ac8cb12a3ab70412df 100644 (file)
@@ -752,10 +752,6 @@ populate_list (GtkFontChooserWidget *fontchooser,
           const gchar *face_name;
           gchar *font_desc;
 
-          if (priv->filter_func != NULL &&
-              !priv->filter_func (families[i], faces[j], priv->filter_data))
-            continue;
-
           pango_desc = pango_font_face_describe (faces[j]);
           face_name = pango_font_face_get_face_name (faces[j]);
           font_desc = pango_font_description_to_string (pango_desc);
@@ -831,6 +827,25 @@ visible_func (GtkTreeModel *model,
   gchar *font_name, *font_name_casefold, *term_casefold;
   guint i;
 
+  if (priv->filter_func != NULL)
+    {
+      PangoFontFamily *family;
+      PangoFontFace *face;
+
+      gtk_tree_model_get (model, iter,
+                          FAMILY_COLUMN, &family,
+                          FACE_COLUMN, &face,
+                          -1);
+
+      result = priv->filter_func (family, face, priv->filter_data);
+
+      g_object_unref (family);
+      g_object_unref (face);
+      
+      if (!result)
+        return FALSE;
+    }
+
   /* If there's no filter string we show the item */
   search_text = gtk_entry_get_text (GTK_ENTRY (priv->search_entry));
   if (strlen (search_text) == 0)
@@ -1190,9 +1205,7 @@ gtk_font_chooser_widget_set_filter_func (GtkFontChooser  *chooser,
   priv->filter_data = data;
   priv->filter_data_destroy = destroy;
 
-  populate_list (fontchooser,
-                 GTK_TREE_VIEW (priv->family_face_list),
-                 priv->model);
+  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter_model));
 }
 
 static void